package mc.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import mc.domain.Faktura;
import mc.util.DateConvert;
import mc.util.McDate;

public class FakturaManagerDAOHb extends HibernateDaoSupport implements IFakturaManagerDAO {

	public void deleteFaktura(Faktura faktura) {
		getHibernateTemplate().delete(faktura);
	}

	public List getAllFaktura() {
		return getHibernateTemplate().find("from Faktura");
	}

	public Faktura getFakturaById(int id) {
		return (Faktura) getHibernateTemplate().get(Faktura.class, new Integer(id));
	}

	public void saveFaktura(Faktura faktura) {
		getHibernateTemplate().save(faktura);
	}

	public List<Faktura> getFakturabyDate(String dzien) {
		
		McDate dat=DateConvert.getRangeForOneDay(dzien);
		return (ArrayList<Faktura>) getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Faktura.class).add
				(Expression.between("data_wystawienia", dat.getFrom(), dat.getTo())));
	}

	public List<Faktura> getFakturabyDates(String dzienOd, String dzienDo) {
		McDate dat=DateConvert.getRangeForInterval(dzienOd, dzienDo);
		return (ArrayList<Faktura>) getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Faktura.class).add
				(Expression.between("data_wystawienia", dat.getFrom(), dat.getTo())));
	}

	public int getMaxNrFaktury() {
		
		if(!getFlgCzy_Zakonczono_Rok()){
		
		Integer nr_faktury=(Integer)(getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Faktura.class).setProjection
				(Projections.max("nr_faktury")))).get(0);
		
		return nr_faktury==null ? 0  : nr_faktury;
		}
		else{
			setFlgCzy_Zakonczono_Rok(false);
			return 0;
		}
		
	}

	public int getMaxNrKorekty() {
		
		Integer nr_korekty=(Integer)(getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(Faktura.class).setProjection
				(Projections.max("nr_korekty")))).get(0);
		
		return nr_korekty==null ? 0 : nr_korekty;
	}

	public void setFlgCzy_Zakonczono_Rok(final boolean flag) {
		StringBuffer sql = new StringBuffer("update service set czy_zakonczono_rok = ");
		sql.append(flag);
		sql.append(" where id=1");
		try {
			getSession().connection().createStatement().executeUpdate(sql.toString());
		} catch (Exception e) {
			System.out.println("Nie udalo sie zmienic flagi czy_zakonczono_rok");
			e.printStackTrace();
		}
	}

	public boolean getFlgCzy_Zakonczono_Rok() {
		return (Boolean) getHibernateTemplate().execute(new HibernateCallback(){

			public Object doInHibernate(Session session){
								
				StringBuffer sql = new StringBuffer( "select czy_zakonczono_rok as result from service where id=1");
				Query query = session.createSQLQuery(sql.toString()).addScalar("result",Hibernate.BOOLEAN);
				return query.uniqueResult();
			}
		});		
	}

	public Date getAktualnyCzasZBazy() {
			return (Date) getHibernateTemplate().execute(new HibernateCallback(){

				public Object doInHibernate(Session session) throws HibernateException, SQLException {
					
					StringBuffer sql = new StringBuffer("select now() as result");
					Query query = session.createSQLQuery(sql.toString()).addScalar("result",Hibernate.TIMESTAMP);
					return query.uniqueResult();
				}
			});
	}

}
